!--------------------------------
! Programa dedicado a calcular todos os primos
! menores que um dado numero de escolha.
!
! Programa compilado e testado com:
! $ gfortran -o exec06 exec06.f90
! $ ./exec06
! 
! Forma de utilizacao auto-explicativa
! atravez de comentarios.
!
! _o_o_ oOo _o_o_ 03/09/2010

PROGRAM exec06
  IMPLICIT NONE
  INTEGER :: M, primo, contador, contador2, apontador, ehprimo
  REAL :: sqrtp
  INTEGER, DIMENSION(1000000) :: primos
  write(*,*) "- Entre com o limite superior da serie de inteiros que voce quer."
  read(*,*) M

  primos(1)= 2
  primos(2)= 3
  contador = 2
  apontador = 3
  DO WHILE (apontador<M-1)
    apontador = apontador + 2
    sqrtp=apontador**0.5
    contador2=1
    ehprimo=0
    DO WHILE (contador2 < contador)
      IF ( primos(contador2) > sqrtp) THEN
        ehprimo=1
        EXIT
      ELSE IF (MOD(apontador,primos(contador2)) == 0) THEN
        EXIT
      END IF
      contador2 = contador2 + 1
    END DO
    if (contador2 ==contador) THEN
      ehprimo=1
    END IF
    IF (ehprimo==1) THEN
      contador = contador + 1
      primos(contador) = apontador
    END IF
  END DO

  contador2=1
  open(unit=10,file="primos_out.dat")
  DO WHILE (contador2<=contador)
    write(10,*) primos(contador2)
    contador2=contador2+1
  END DO
  write(*,*) contador, "primos escritos no arquivo 'primos_out.dat'"
END PROGRAM
